package com.boilermaker.mq.mqserver.core;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;
import java.util.UUID;

/*
 * 表示传递的消息
 * 实现 Serializable 接口使得该类能被序列化和反序列化，该接口不需要重写方法
 */

@Getter
@Setter
@ToString
public class Message implements Serializable {
    private BasicProperties basicProperties = new BasicProperties();
    private byte[] body;
    // 偏移量，序列化时使用，计算消息长度
    // transient 关键字修饰表示该字段不需要被序列化（文件中会使用约定格式记录消息长度）
    private transient long offsetBegin = 0;
    private transient long offsetEnd = 0;
    // 该消息是否有效（逻辑删除），0x1 表示有效，0x0 表示无效
    private byte isValid = 0x1;

    // 工厂方法：使用 UUID 生成 messageId
    public static Message createMessageWithId(String routingKey, BasicProperties basicProperties, byte[] body) {
        Message message = new Message();
        if (basicProperties != null) {
            message.setBasicProperties(basicProperties);
        }
        message.setMessageId("M-" + UUID.randomUUID());
        message.setRoutingKey(routingKey);
        message.body = body;
        return message;
    }

    public String getMessageId() {
        return basicProperties.getMessageId();
    }

    public void setMessageId(String MessageId) {
        basicProperties.setMessageId(MessageId);
    }

    public String getRoutingKey() {
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey(String routingKey) {
        basicProperties.setRoutingKey(routingKey);
    }

    public Integer getDeliverMode() {
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(Integer deliverMode) {
        basicProperties.setDeliverMode(deliverMode);
    }
}
